home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_008 / src / mklv.shk.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  4KB  |  135 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
  2.  
  3. #ifndef QUEST
  4. #include "mklev.h"
  5. #include "def.eshk.h"
  6. #define   ESHK   ((struct eshk *)(&(shk->mextra[0])))
  7. extern struct monst *makemon();
  8.  
  9. extern char shtypes[]; /* = "=/)%?!["; ** 8 shoptypes: 7 specialised, 1 mixed */
  10. schar shprobs[] = { 3,3,5,5,10,10,14,50 };   /* their probabilities */
  11.  
  12. mkshop(){
  13. register struct mkroom *sroom;
  14. register int sh,sx,sy,i;
  15. register char let;
  16. int roomno;
  17. register struct monst *shk;
  18.    for(sroom = &rooms[0], roomno = 0; ; sroom++, roomno++){
  19.       if(sroom->hx < 0) return;
  20.       if(sroom->lx <= xdnstair && xdnstair <= sroom->hx &&
  21.          sroom->ly <= ydnstair && ydnstair <= sroom->hy) continue;
  22.       if(sroom->lx <= xupstair && xupstair <= sroom->hx &&
  23.          sroom->ly <= yupstair && yupstair <= sroom->hy) continue;
  24.       if(
  25. #ifdef WIZARD
  26.          wizard ||
  27. #endif WIZARD
  28.          sroom->doorct == 1) break;
  29.    }
  30. #ifdef WIZARD
  31.    if(wizard){
  32.       extern char *getenv();
  33.       register char *ep = getenv("SHOPTYPE");
  34.       if(ep){
  35.          if(*ep == 'z' || *ep == 'Z'){
  36.             mkzoo();
  37.             return;
  38.          }
  39.          for(i=0; shtypes[i]; i++)
  40.             if(*ep == shtypes[i]) break;
  41.          let = i;
  42.          goto gotlet;
  43.       }
  44.    }
  45. #endif WIZARD
  46.    for(i = rn2(100),let = 0; (i -= shprobs[let])>= 0; let++)
  47.       if(!shtypes[let]) break;   /* superfluous */
  48. #ifdef WIZARD
  49. gotlet:
  50. #endif WIZARD
  51.    sroom->rtype = 8+let;
  52.    let = shtypes[let];
  53.    sh = sroom->fdoor;
  54.    sx = doors[sh].x;
  55.    sy = doors[sh].y;
  56.    if(sx == sroom->lx-1) sx++; else
  57.    if(sx == sroom->hx+1) sx--; else
  58.    if(sy == sroom->ly-1) sy++; else
  59.    if(sy == sroom->hy+1) sy--; else {
  60.       myprintf("Where is shopdoor?");
  61.       return;
  62.    }
  63.    if(!(shk = makemon(PM_SHK,sx,sy))) return;
  64.    shk->isshk = shk->mpeaceful = 1;
  65.    shk->msleep = 0;
  66.    shk->mtrapseen = ~0;   /* we know all the traps already */
  67.    ESHK->shoproom = roomno;
  68.    ESHK->shd = doors[sh];
  69.    ESHK->shk.x = sx;
  70.    ESHK->shk.y = sy;
  71.    ESHK->robbed = 0;
  72.    ESHK->visitct = 0;
  73.    shk->mgold = 1000 + 30*rnd(100);   /* initial capital */
  74.    ESHK->billct = 0;
  75.    findname(ESHK->shknam, let);
  76.    for(sx = sroom->lx; sx <= sroom->hx; sx++)
  77.    for(sy = sroom->ly; sy <= sroom->hy; sy++){
  78.       register struct monst *mtmp;
  79.       if((sx == sroom->lx && doors[sh].x == sx-1) ||
  80.          (sx == sroom->hx && doors[sh].x == sx+1) ||
  81.          (sy == sroom->ly && doors[sh].y == sy-1) ||
  82.          (sy == sroom->hy && doors[sh].y == sy+1)) continue;
  83.       if(rn2(100) < dlevel && !m_at(sx,sy) &&
  84.          (mtmp = makemon(PM_MIMIC, sx, sy))){
  85.          mtmp->mimic =
  86.              (let && rn2(10) < dlevel) ? let : ']';
  87.          continue;
  88.       }
  89.       mkobj_at(let, sx, sy);
  90.    }
  91. #ifdef WIZARD
  92.    if(wizard) myprintf("I made a %c-shop.", let ? let : 'g');
  93. #endif WIZARD
  94. }
  95.  
  96. mkzoo(){
  97. register struct mkroom *sroom;
  98. register int sh,sx,sy,i;
  99. int goldlim = 500 * dlevel;
  100.    for(sroom = &rooms[0]; ; sroom++){
  101.       if(sroom->hx < 0) return;
  102.       if(sroom->lx <= xdnstair && xdnstair <= sroom->hx &&
  103.          sroom->ly <= ydnstair && ydnstair <= sroom->hy) continue;
  104.       if(sroom->lx <= xupstair && xupstair <= sroom->hx &&
  105.          sroom->ly <= yupstair && yupstair <= sroom->hy) continue;
  106.       if(sroom->doorct == 1) break;
  107.    }
  108.    sroom->rtype = 7;
  109.    sh = sroom->fdoor;
  110.    for(sx = sroom->lx; sx <= sroom->hx; sx++)
  111.    for(sy = sroom->ly; sy <= sroom->hy; sy++){
  112.       if((sx == sroom->lx && doors[sh].x == sx-1) ||
  113.          (sx == sroom->hx && doors[sh].x == sx+1) ||
  114.          (sy == sroom->ly && doors[sh].y == sy-1) ||
  115.          (sy == sroom->hy && doors[sh].y == sy+1)) continue;
  116.       (void) makemon((struct permonst *) 0,sx,sy);
  117.       i = sq(dist2(sx,sy,doors[sh].x,doors[sh].y));
  118.       if(i >= goldlim) i = 5*dlevel;
  119.       goldlim -= i;
  120.       mkgold(10 + rn2(i), sx, sy);
  121.    }
  122. #ifdef WIZARD
  123.    if(wizard) myprintf("I made a zoo.");
  124. #endif WIZARD
  125. }
  126.  
  127. dist2(x0,y0,x1,y1){
  128.    return((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1));
  129. }
  130.  
  131. sq(a) int a; {
  132.    return(a*a);
  133. }
  134. #endif QUEST
  135.